package jhh.service;

import java.util.List;

import jhh.entity.JmxInfo;

import org.dom4j.Document;
import org.dom4j.Element;

import utils.Dom4jUtils;


public class JmxReader {
     public JmxInfo ReaderJmx(String path){
    	 JmxInfo info=new JmxInfo();
    	 String str="";
    	 Document document=Dom4jUtils.getDocument(path);
    	 //获取到根节点下的线程组数
    	 Element hashTree=(Element) document.selectSingleNode("/jmeterTestPlan/hashTree/hashTree");
    	 List<Element> ThreadGroup=hashTree.elements("ThreadGroup");
    	 String[] TGname=new String[ThreadGroup.size()];
    	 //获取线程组信息
    	 for(int i=0;i<ThreadGroup.size();i++){
    		 str+="线程组"+(i+1)+":"+" ";
    		 TGname[i]=ThreadGroup.get(i).attributeValue("testname");
    		 str+=TGname[i]+"<br/>";
    		 Element tg=ThreadGroup.get(i);
    		 List<Element> TgInfo=tg.elements();
    		 str+="线程组遇到错误后的处理方式"+TgInfo.get(0).getText()+" ";
    		 Element main_controller=tg.element("elementProp");//TgInfo.get(1);
    		 Element loop=main_controller.element("stringProp");
    		 if(loop!=null){
    		 str+="循环"+loop.getText()+"次"+" ";
    		 }
    		 str+="单次线程组个数为："+TgInfo.get(2).getText()+"<br/>";
    		 //获取ThreadGroup下面一个元素（根据Jmx的规则 ，每个元素的子元素均在元素的下一个元素HashTree中）
    		 List<Element> brolist=hashTree.elements();
    		 int j=brolist.indexOf(tg);
    		 //获取到ThreadGroup的子元素的根节点HashTree
    		 Element ht=brolist.get((j+1));
    		 //查看此线程组中是否包含LoopController这一元素（这是步骤化测试的元素）
    		 List<Element> list=ht.elements("LoopController");
    		 
    		 //如果存在，则依次读出每一个LoopController中的每个步骤的信息
        	 if(list.size()!=0){
        		 str+="存在step，其中";
        		 for (Element element : list) {
        			//获取每个LoopController的子元素，即步骤化测试的每一个步骤
        			 //（根据Jmx的规则 ，每个元素的子元素均在元素的下一个元素HashTree中，故要获取LoopController的兄弟元素HashTree）
    				Element parent=element.getParent();
    				List<Element> borlist=parent.elements();
    				int k=borlist.indexOf(element);
    				Element hashTree1=borlist.get((k+1));
    				//获取每一个HashTree中的每个HTTPSamplerProxy，以获取每个步骤的测试网站信息
    				List<Element> HttpList=hashTree1.elements("HTTPSamplerProxy");
    				int l=0;
    				for (Element element2 : HttpList) {
    					l++;
    					 List<Element> list2=element2.elements();
    					 //获取网站的信息
    					str+="步骤"+l+"为：<br/>";
    					str+="  "+"其中URL为：";
    					str+=list2.get(5).getText()+"://"+list2.get(1).getText()+":"+list2.get(2).getText()+list2.get(7).getText()+"<br/>";
    				}
    			}
        		 
        	 }
        	 /*获取每个线程组中的普通采样器
        	  * 其中，若采样器中没有网站信息，则说明信息可能存在HttpConfigTestElement中
        	  * 其中ConfigTestElement存在优先级关系
        	  * 子元素中的ConfigTestElement的优先级比兄弟节点中的ConfigTestElement优先级高
        	  * */
        	 List<Element> AllHttp=ht.elements("HTTPSamplerProxy");
        	 str+="存在"+AllHttp.size()+"个Http采样器,其中：<br/>";
        	 for(int m=0;m<AllHttp.size();m++){
        		 str+="第"+(m+1)+"个采样器：<br/>";
        		 List<Element> list2=AllHttp.get(m).elements();
        		 str+="  "+"其中URL为：";
        		 if(list2.get(1).getText().equals("")){
        			// System.out.println("0000");
        			List<Element> AllEle=ht.elements();
        			int z=AllEle.indexOf(AllHttp.get(m));
        			 Element ConfigTestElement=AllEle.get(z+1);
        			 if(ConfigTestElement.elements().size()!=0){
        				 Element Config=(Element) ConfigTestElement.elements().get(0);
        				 List<Element> ConfigList=Config.elements();
        				 str+=ConfigList.get(5).getText()+"://"+ConfigList.get(1).getText()+":"+ConfigList.get(2).getText()+ConfigList.get(7).getText()+"<br/>";
        			 }else{
        				 Element Config=ht.element("ConfigTestElement");
        				 List<Element> ConfigList=Config.elements();
        				// System.out.println(ConfigList.get(0).attributeValue("name"));
        				 if(ConfigList.get(1).getText()==null){
        					 str+="该脚本存在问题，采样器URL为空";
        				 }else{
        					 str+=ConfigList.get(5).getText()+"://"+ConfigList.get(1).getText()+":"+ConfigList.get(2).getText()+ConfigList.get(7).getText()+"<br/>";
        				 }
        				 
        			 }
        		 }else{
					str+=list2.get(5).getText()+"://"+list2.get(1).getText()+":"+list2.get(2).getText()+list2.get(7).getText()+"<br/>";
        		 }
        	 }
    		 
    		 
    		 
    	 }
    	 info.setJmxTestInfo(str);
    	 info.setThreadGroup(TGname);
    	 return info;
     }
}
